package com.zijidelu.luframework.domain.model.entity;

import com.zijidelu.luframework.base.TypeCaster;
import com.zijidelu.luframework.base.model.DataModel;

import java.io.Serializable;

/**
 * 子实体接口。
 * <p>
 * 子实体是指关联到其他实体的实体，通常用于表示一对多或多对多的关系。
 *
 * @author ZIJIDELU
 * @datetime 2025/11/14 17:57
 */
public interface ChildEntity<E extends Entity<?>, D extends DataModel> extends Entity<D> {
    /**
     * 设置子实体关联的父实体ID属性。
     *
     * @param rootEntityId 父实体ID
     */
    void setRootEntityId(Serializable rootEntityId);

    /**
     * 获取子实体关联的父实体ID属性。
     *
     * @return 父实体ID
     */
    Serializable getRootEntityId();

    /**
     * 获取子实体关联的父实体类。
     *
     * @return 父实体类
     */
    default Class<E> getRootEntityClass() {
        return TypeCaster.cast(EntityRelation.calcRootEntityType(this.getClass()));
    }

    /**
     * 获取子实体关联的父实体ID属性。
     *
     * @return 父实体ID
     */
    default EntityRelation getEntityRelation() {
        return EntityRelation.of(getRootEntityClass(), this.getClass());
    }

}
